package com.kaifamiao.deque;

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * 1、对于双端队列来说，两端都可以添加元素，也可以删除元素
 * 2、为了搞清楚哪里是头，哪里是为，我们以字符串形式为参照
 * 3、若以字符串形式左侧为头右侧为尾，则采用以下方法操作队列
 *    addLast( E ) 在队列尾部添加元素(可能抛出异常)
 *    getFirst() 检查队列头部元素(若队列为空则抛出异常)
 *    removeFirst() 移除队列头部元素(若队列为空则抛出异常)
 */
public class DequeTest2 {

	public static void main(String[] args) {
		
		Deque<String> dq = new LinkedList<>();
		
		dq.addAll( List.of( "唐三藏" , "孙悟空" ) );
		/** 以字符串形式的左侧为头部，右侧为尾部 */
		System.out.println( dq.toString() );
		
		dq.addLast( "白龙马" ); // 在队列尾部添加元素
		System.out.println( dq.toString() );
		
		dq.addLast( "猪八戒" ); // 在队列尾部添加元素
		System.out.println( dq.toString() );
		
		dq.addLast( "沙悟净" ); // 在队列尾部添加元素
		System.out.println( dq.toString() );
		
		String head ;
		
		head = dq.getFirst(); // 检查头部元素(但不移除)
		System.out.println( head );
		System.out.println( dq.toString() );
		
		// 若集合不为空
		while( !dq.isEmpty() ) {
			head = dq.removeFirst(); // 移除队列头部元素(并返回被移除的元素)
			System.out.println( head );
			System.out.println( dq.toString() );
		}
		
		// System.out.println( dq.getFirst() ); // 若队列为空则抛出NoSuchElementException
		// System.out.println( dq.removeFirst() ); // 若队列为空则抛出NoSuchElementException
	}

}
